jekyll-remote-theme 0.4.3 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4c9167cea38476d7fc4ef44836e821cb07d5bcabb665e834a8df9f1cae315b70
4
- data.tar.gz: 28698c0255ba7c3b9b85758e7ed52c899ffbdd49460064513d8a28a19d174b49
3
+ metadata.gz: 25fe811cc5335e5f2932bc6db5e74c83b2f7984229d745d13a6ba850396f3e44
4
+ data.tar.gz: 617b6d962ddea1194a7f0f801124756deada8b6a0960ba9ecabf11bdebb2ef4c
5
5
  SHA512:
6
- metadata.gz: 5c9f12811ead638abbb9022f63221ef49fd6bd2f743e42d58645431aa0565946b74324131710d76ed9567adc812b316425f47e41c55ba379a4073f7812ec5b0a
7
- data.tar.gz: 4ae168e2f471af7bfa0cdc39a479f3bb05fe4420d30a3036206f29b50f49f267004fa8ac4deaa4da26f887eae3f3b5e38b521cb189ed479d5262aa289d33dc11
6
+ metadata.gz: f36daa0ed584f6c5c25f0006b0eab5075c35fc252e7bba19fcbd72a8b225217545c11da7d38dd00c82cbff666cb42fdce3b1d440b4e610cfbc3f74c69f127a80
7
+ data.tar.gz: a78d981b482904e7f673235a18c5e9a058f33fb0e0714dbeee2788abf64e60552b44b05550634538555daf0fbbd7c95350590f1a2a5d278d5a2630de1f27c234
@@ -9,6 +9,7 @@ module Jekyll
9
9
  NET_HTTP_ERRORS = [
10
10
  Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::OpenTimeout,
11
11
  Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError,
12
+ OpenSSL::SSL::SSLError,
12
13
  ].freeze
13
14
 
14
15
  def initialize(theme)
@@ -16,6 +17,11 @@ module Jekyll
16
17
  end
17
18
 
18
19
  def run
20
+ if theme.local_theme?
21
+ Jekyll.logger.debug LOG_KEY, "Using local theme at #{theme.root}"
22
+ return
23
+ end
24
+
19
25
  if downloaded?
20
26
  Jekyll.logger.debug LOG_KEY, "Using existing #{theme.name_with_owner}"
21
27
  return
@@ -26,6 +32,8 @@ module Jekyll
26
32
  end
27
33
 
28
34
  def downloaded?
35
+ return true if theme.local_theme?
36
+
29
37
  @downloaded ||= theme_dir_exists? && !theme_dir_empty?
30
38
  end
31
39
 
@@ -37,11 +45,12 @@ module Jekyll
37
45
  @zip_file ||= Tempfile.new([TEMP_PREFIX, ".zip"], :binmode => true)
38
46
  end
39
47
 
48
+ # rubocop:disable Metrics/AbcSize
40
49
  def download
41
50
  Jekyll.logger.debug LOG_KEY, "Downloading #{zip_url} to #{zip_file.path}"
42
- Net::HTTP.start(zip_url.host, zip_url.port, :use_ssl => true) do |http|
51
+ http_class.start(zip_url.host, zip_url.port, :use_ssl => true) do |http|
43
52
  http.request(request) do |response|
44
- raise_unless_sucess(response)
53
+ raise_unless_success(response)
45
54
  enforce_max_file_size(response.content_length)
46
55
  response.read_body do |chunk|
47
56
  zip_file.write chunk
@@ -52,6 +61,7 @@ module Jekyll
52
61
  rescue *NET_HTTP_ERRORS => e
53
62
  raise DownloadError, e.message
54
63
  end
64
+ # rubocop:enable Metrics/AbcSize
55
65
 
56
66
  def request
57
67
  return @request if defined? @request
@@ -61,10 +71,18 @@ module Jekyll
61
71
  @request
62
72
  end
63
73
 
64
- def raise_unless_sucess(response)
74
+ def raise_unless_success(response)
65
75
  return if response.is_a?(Net::HTTPSuccess)
66
76
 
67
- raise DownloadError, "#{response.code} - #{response.message} - Loading URL: #{zip_url}"
77
+ case response.code
78
+ when "404"
79
+ raise DownloadError, "The repository '#{theme.name_with_owner}' could not be found. " \
80
+ "Please check that the repository name is correct, " \
81
+ "publicly accessible, and contains a valid Jekyll theme. " \
82
+ "URL: #{zip_url}"
83
+ else
84
+ raise DownloadError, "#{response.code} - #{response.message} - Loading URL: #{zip_url}"
85
+ end
68
86
  end
69
87
 
70
88
  def enforce_max_file_size(size)
@@ -96,6 +114,52 @@ module Jekyll
96
114
  ).normalize
97
115
  end
98
116
 
117
+ # Returns an HTTP class that respects proxy environment variables
118
+ def http_class
119
+ @http_class ||= Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass)
120
+ end
121
+
122
+ # Extracts proxy settings from environment variables
123
+ def proxy_uri
124
+ return @proxy_uri if defined?(@proxy_uri)
125
+
126
+ proxy_env = find_proxy_env_var
127
+ @proxy_uri = parse_proxy_uri(proxy_env)
128
+ end
129
+
130
+ def find_proxy_env_var
131
+ # Check for HTTPS proxy first if the URL uses HTTPS
132
+ if theme.scheme == "https"
133
+ ENV["https_proxy"] || ENV["HTTPS_PROXY"] || ENV["http_proxy"] || ENV["HTTP_PROXY"]
134
+ else
135
+ ENV["http_proxy"] || ENV["HTTP_PROXY"]
136
+ end
137
+ end
138
+
139
+ def parse_proxy_uri(proxy_env)
140
+ return nil unless proxy_env
141
+
142
+ Addressable::URI.parse(proxy_env)
143
+ rescue Addressable::URI::InvalidURIError
144
+ nil
145
+ end
146
+
147
+ def proxy_host
148
+ proxy_uri&.host
149
+ end
150
+
151
+ def proxy_port
152
+ proxy_uri&.port
153
+ end
154
+
155
+ def proxy_user
156
+ proxy_uri&.user
157
+ end
158
+
159
+ def proxy_pass
160
+ proxy_uri&.password
161
+ end
162
+
99
163
  def theme_dir_exists?
100
164
  theme.root && Dir.exist?(theme.root)
101
165
  end
@@ -12,6 +12,15 @@ module Jekyll
12
12
  DEPENDENCY_PREFIX = %r!^\s*[a-z]+\.add_(?:runtime_)?dependency!.freeze
13
13
  DEPENDENCY_REGEX = %r!#{DEPENDENCY_PREFIX}\(?\s*["']([a-z_-]+)["']!.freeze
14
14
 
15
+ # Regex patterns for extracting gemspec metadata
16
+ AUTHORS_REGEX = %r!^\s*[a-z_]+\.authors\s*=\s*\[(.*?)\]!m.freeze
17
+ VERSION_REGEX = %r!^\s*[a-z_]+\.version\s*=\s*["']([^"']+)["']!.freeze
18
+ SUMMARY_REGEX = %r!^\s*[a-z_]+\.summary\s*=\s*["'](.*?)["']!.freeze
19
+ DESCRIPTION_REGEX = %r!^\s*[a-z_]+\.description\s*=\s*["'](.*?)["']!.freeze
20
+
21
+ # Default version when gemspec is missing or version cannot be determined
22
+ DEFAULT_VERSION = "0.0.0"
23
+
15
24
  def initialize(theme)
16
25
  @theme = theme
17
26
  end
@@ -22,6 +31,51 @@ module Jekyll
22
31
  end
23
32
  end
24
33
 
34
+ # Returns an array of authors from the gemspec
35
+ def authors
36
+ @authors ||= begin
37
+ match = contents&.match(AUTHORS_REGEX)
38
+ # Extract author names from the array string
39
+ match ? match[1].scan(%r!["']([^"']+)["']!).flatten : []
40
+ end
41
+ end
42
+
43
+ # Returns the version from the gemspec as a Gem::Version object
44
+ # Note: This extracts literal version strings like "1.2.3" from the gemspec.
45
+ # It cannot evaluate version constants like MyGem::VERSION.
46
+ def version
47
+ @version ||= begin
48
+ match = contents&.match(VERSION_REGEX)
49
+ # Extract the version string and convert to Gem::Version
50
+ match ? Gem::Version.new(match[1]) : Gem::Version.new(DEFAULT_VERSION)
51
+ rescue ArgumentError
52
+ # If the version string is invalid, return default
53
+ Gem::Version.new(DEFAULT_VERSION)
54
+ end
55
+ end
56
+
57
+ # Returns the summary from the gemspec
58
+ def summary
59
+ @summary ||= begin
60
+ match = contents&.match(SUMMARY_REGEX)
61
+ match ? match[1] : ""
62
+ end
63
+ end
64
+
65
+ # Returns the description from the gemspec
66
+ def description
67
+ @description ||= begin
68
+ match = contents&.match(DESCRIPTION_REGEX)
69
+ match ? match[1] : nil
70
+ end
71
+ end
72
+
73
+ # Returns metadata hash from the gemspec
74
+ # Note: Metadata parsing is not currently implemented
75
+ def metadata
76
+ @metadata ||= {}
77
+ end
78
+
25
79
  private
26
80
 
27
81
  def contents
@@ -52,12 +52,29 @@ module Jekyll
52
52
 
53
53
  site.config["theme"] = theme.name
54
54
  site.theme = theme
55
- site.theme.configure_sass if site.theme.respond_to?(:configure_sass)
55
+ configure_sass
56
56
  site.send(:configure_include_paths)
57
57
  site.plugin_manager.require_theme_deps
58
+ initialize_github_metadata
59
+ end
60
+
61
+ def configure_sass
62
+ site.theme.configure_sass if site.theme.respond_to?(:configure_sass)
63
+ end
64
+
65
+ # Initialize GitHub metadata munger if it was loaded after :after_init hook
66
+ def initialize_github_metadata
67
+ return unless defined?(Jekyll::GitHubMetadata::SiteGitHubMunger)
68
+ return if Jekyll::GitHubMetadata::SiteGitHubMunger.global_munger
69
+
70
+ munger = Jekyll::GitHubMetadata::SiteGitHubMunger.new(site)
71
+ munger.munge!
72
+ Jekyll::GitHubMetadata::SiteGitHubMunger.global_munger = munger
58
73
  end
59
74
 
60
75
  def enqueue_theme_cleanup
76
+ return if theme.local_theme? # Don't clean up local theme directories
77
+
61
78
  at_exit do
62
79
  Jekyll.logger.debug LOG_KEY, "Cleaning up #{theme.root}"
63
80
  FileUtils.rm_rf theme.root
@@ -5,7 +5,7 @@ module Jekyll
5
5
  class Theme < Jekyll::Theme
6
6
  OWNER_REGEX = %r!(?<owner>[a-z0-9\-]+)!i.freeze
7
7
  NAME_REGEX = %r!(?<name>[a-z0-9\._\-]+)!i.freeze
8
- REF_REGEX = %r!@(?<ref>[a-z0-9\._\-]+)!i.freeze # May be a branch, tag, or commit
8
+ REF_REGEX = %r!@(?<ref>[a-z0-9\._\-]+)!i.freeze # May be a branch, tag, commit, or "latest"
9
9
  THEME_REGEX = %r!\A#{OWNER_REGEX}/#{NAME_REGEX}(?:#{REF_REGEX})?\z!i.freeze
10
10
 
11
11
  # Initializes a new Jekyll::RemoteTheme::Theme
@@ -18,16 +18,25 @@ module Jekyll
18
18
  # - An enterprise GitHub instance + a GitHub owner + a theme-name string
19
19
  # 4. http[s]://github.<yourEnterprise>.com/owner/theme-name@git_ref
20
20
  # - An enterprise GitHub instance + a GitHub owner + a theme-name + Git ref string
21
+ # 5. /absolute/path/to/theme - an absolute local file path
22
+ # 6. ../relative/path/to/theme - a relative local file path
23
+ # 7. ~/path/to/theme - a home directory relative path
21
24
  def initialize(raw_theme)
22
- @raw_theme = raw_theme.to_s.downcase.strip
25
+ original_theme = raw_theme.to_s.strip
26
+ local_path = looks_like_local_path?(original_theme)
27
+ @raw_theme = local_path ? original_theme : original_theme.downcase
23
28
  super(@raw_theme)
24
29
  end
25
30
 
26
31
  def name
32
+ return File.basename(expanded_local_path) if local_theme?
33
+
27
34
  theme_parts[:name]
28
35
  end
29
36
 
30
37
  def owner
38
+ return "local" if local_theme?
39
+
31
40
  theme_parts[:owner]
32
41
  end
33
42
 
@@ -45,28 +54,59 @@ module Jekyll
45
54
  alias_method :nwo, :name_with_owner
46
55
 
47
56
  def valid?
48
- return false unless uri && theme_parts && name && owner
57
+ return local_path_valid? if local_theme?
49
58
 
50
- host && valid_hosts.include?(host)
59
+ remote_theme_valid?
51
60
  end
52
61
 
53
62
  def git_ref
54
- theme_parts[:ref] || "HEAD"
63
+ return "HEAD" if local_theme?
64
+
65
+ parsed_ref = theme_parts[:ref]
66
+ return "HEAD" unless parsed_ref
67
+ return resolve_latest_release if parsed_ref == "latest"
68
+
69
+ parsed_ref
55
70
  end
56
71
 
57
72
  def root
58
- @root ||= File.realpath Dir.mktmpdir(TEMP_PREFIX)
73
+ @root ||= local_theme? ? expanded_local_path : File.realpath(Dir.mktmpdir(TEMP_PREFIX))
59
74
  end
60
75
 
61
76
  def inspect
62
- "#<Jekyll::RemoteTheme::Theme host=\"#{host}\" owner=\"#{owner}\" name=\"#{name}\"" \
63
- " ref=\"#{git_ref}\" root=\"#{root}\">"
77
+ "#<Jekyll::RemoteTheme::Theme host=\"#{host}\" owner=\"#{owner}\" name=\"#{name}\" " \
78
+ "ref=\"#{git_ref}\" root=\"#{root}\">"
79
+ end
80
+
81
+ def local_theme?
82
+ @local_theme ||= looks_like_local_path?(@raw_theme)
64
83
  end
65
84
 
66
85
  private
67
86
 
87
+ def looks_like_local_path?(path)
88
+ # Check if it looks like a local path
89
+ # Supports: /, ./, ../, ~/ (Unix-style) and drive letters (Windows-style)
90
+ path.start_with?("/", "./", "../", "~/") || path.match?(%r!\A[a-z]:[/\\]!i)
91
+ end
92
+
93
+ def expanded_local_path
94
+ @expanded_local_path ||= File.expand_path(@raw_theme)
95
+ end
96
+
97
+ def local_path_valid?
98
+ Dir.exist?(expanded_local_path)
99
+ end
100
+
101
+ def remote_theme_valid?
102
+ return false unless uri && theme_parts && name && owner
103
+
104
+ host && valid_hosts.include?(host)
105
+ end
106
+
68
107
  def uri
69
108
  return @uri if defined? @uri
109
+ return @uri = nil if local_theme?
70
110
 
71
111
  @uri = if THEME_REGEX.match?(@raw_theme)
72
112
  Addressable::URI.new(
@@ -82,6 +122,8 @@ module Jekyll
82
122
  end
83
123
 
84
124
  def theme_parts
125
+ return nil if local_theme?
126
+
85
127
  @theme_parts ||= uri.path[1..-1].match(THEME_REGEX) if uri
86
128
  end
87
129
 
@@ -96,6 +138,100 @@ module Jekyll
96
138
  ENV["GITHUB_HOSTNAME"],
97
139
  ].compact.to_set
98
140
  end
141
+
142
+ def resolve_latest_release
143
+ return @resolve_latest_release if defined? @resolve_latest_release
144
+
145
+ Jekyll.logger.debug LOG_KEY, "Resolving @latest for #{name_with_owner}"
146
+
147
+ @resolve_latest_release = fetch_latest_release_tag || "HEAD"
148
+ end
149
+
150
+ def fetch_latest_release_tag
151
+ api_url = build_api_url
152
+ response = make_api_request(api_url)
153
+
154
+ if response.is_a?(Net::HTTPSuccess)
155
+ parse_tag_from_response(response)
156
+ else
157
+ log_no_releases_warning
158
+ nil
159
+ end
160
+ rescue StandardError => e
161
+ log_api_error(e)
162
+ nil
163
+ end
164
+
165
+ def build_api_url
166
+ Addressable::URI.new(
167
+ :scheme => scheme,
168
+ :host => api_host,
169
+ :path => api_path
170
+ )
171
+ end
172
+
173
+ def make_api_request(api_url)
174
+ Net::HTTP.start(
175
+ api_url.host,
176
+ api_url.port,
177
+ :use_ssl => api_url.scheme == "https"
178
+ ) do |http|
179
+ request = Net::HTTP::Get.new(api_url.request_uri)
180
+ request["Accept"] = "application/vnd.github.v3+json"
181
+ request["User-Agent"] = Downloader::USER_AGENT
182
+ http.request(request)
183
+ end
184
+ end
185
+
186
+ def parse_tag_from_response(response)
187
+ data = JSON.parse(response.body)
188
+ tag = data["tag_name"]
189
+
190
+ if tag.nil? || tag.empty?
191
+ Jekyll.logger.warn LOG_KEY,
192
+ "No tag_name in API response for #{name_with_owner}, using HEAD"
193
+ return nil
194
+ end
195
+
196
+ Jekyll.logger.debug LOG_KEY, "Resolved @latest to #{tag} for #{name_with_owner}"
197
+ tag
198
+ rescue JSON::ParserError => e
199
+ Jekyll.logger.warn LOG_KEY,
200
+ "Failed to parse API response for #{name_with_owner}: " \
201
+ "#{e.message}, using HEAD"
202
+ nil
203
+ end
204
+
205
+ def log_no_releases_warning
206
+ Jekyll.logger.warn LOG_KEY,
207
+ "No releases found for #{name_with_owner}, using HEAD"
208
+ end
209
+
210
+ def log_api_error(error)
211
+ Jekyll.logger.warn LOG_KEY,
212
+ "Failed to fetch latest release for #{name_with_owner}: " \
213
+ "#{error.message}, using HEAD"
214
+ end
215
+
216
+ def api_host
217
+ case host
218
+ when "github.com"
219
+ "api.github.com"
220
+ else
221
+ # For GitHub Enterprise, API is typically at hostname/api/v3
222
+ host
223
+ end
224
+ end
225
+
226
+ def api_path
227
+ case host
228
+ when "github.com"
229
+ "/repos/#{name_with_owner}/releases/latest"
230
+ else
231
+ # For GitHub Enterprise
232
+ "/api/v3/repos/#{name_with_owner}/releases/latest"
233
+ end
234
+ end
99
235
  end
100
236
  end
101
237
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module RemoteTheme
5
- VERSION = "0.4.3"
5
+ VERSION = "0.5.1"
6
6
  end
7
7
  end
@@ -4,8 +4,10 @@ require "jekyll"
4
4
  require "fileutils"
5
5
  require "tempfile"
6
6
  require "addressable"
7
+ require "openssl"
7
8
  require "net/http"
8
9
  require "zip"
10
+ require "json"
9
11
 
10
12
  $LOAD_PATH.unshift(File.dirname(__FILE__))
11
13
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll-remote-theme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Balter
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2021-03-10 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: addressable
@@ -51,9 +50,9 @@ dependencies:
51
50
  - - ">="
52
51
  - !ruby/object:Gem::Version
53
52
  version: '1.0'
54
- - - "<="
53
+ - - "<"
55
54
  - !ruby/object:Gem::Version
56
- version: 3.0.0
55
+ version: '4.0'
57
56
  - - "!="
58
57
  - !ruby/object:Gem::Version
59
58
  version: 2.0.0
@@ -64,12 +63,26 @@ dependencies:
64
63
  - - ">="
65
64
  - !ruby/object:Gem::Version
66
65
  version: '1.0'
67
- - - "<="
66
+ - - "<"
68
67
  - !ruby/object:Gem::Version
69
- version: 3.0.0
68
+ version: '4.0'
70
69
  - - "!="
71
70
  - !ruby/object:Gem::Version
72
71
  version: 2.0.0
72
+ - !ruby/object:Gem::Dependency
73
+ name: openssl
74
+ requirement: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 3.1.2
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: 3.1.2
73
86
  - !ruby/object:Gem::Dependency
74
87
  name: rubyzip
75
88
  requirement: !ruby/object:Gem::Requirement
@@ -91,33 +104,33 @@ dependencies:
91
104
  - !ruby/object:Gem::Version
92
105
  version: '3.0'
93
106
  - !ruby/object:Gem::Dependency
94
- name: jekyll-theme-primer
107
+ name: jekyll_test_plugin_malicious
95
108
  requirement: !ruby/object:Gem::Requirement
96
109
  requirements:
97
110
  - - "~>"
98
111
  - !ruby/object:Gem::Version
99
- version: '0.5'
112
+ version: '0.2'
100
113
  type: :development
101
114
  prerelease: false
102
115
  version_requirements: !ruby/object:Gem::Requirement
103
116
  requirements:
104
117
  - - "~>"
105
118
  - !ruby/object:Gem::Version
106
- version: '0.5'
119
+ version: '0.2'
107
120
  - !ruby/object:Gem::Dependency
108
- name: jekyll_test_plugin_malicious
121
+ name: jekyll-theme-primer
109
122
  requirement: !ruby/object:Gem::Requirement
110
123
  requirements:
111
124
  - - "~>"
112
125
  - !ruby/object:Gem::Version
113
- version: '0.2'
126
+ version: '0.5'
114
127
  type: :development
115
128
  prerelease: false
116
129
  version_requirements: !ruby/object:Gem::Requirement
117
130
  requirements:
118
131
  - - "~>"
119
132
  - !ruby/object:Gem::Version
120
- version: '0.2'
133
+ version: '0.5'
121
134
  - !ruby/object:Gem::Dependency
122
135
  name: kramdown-parser-gfm
123
136
  requirement: !ruby/object:Gem::Requirement
@@ -166,28 +179,84 @@ dependencies:
166
179
  requirements:
167
180
  - - "~>"
168
181
  - !ruby/object:Gem::Version
169
- version: '0.71'
182
+ version: '1.57'
170
183
  type: :development
171
184
  prerelease: false
172
185
  version_requirements: !ruby/object:Gem::Requirement
173
186
  requirements:
174
187
  - - "~>"
175
188
  - !ruby/object:Gem::Version
176
- version: '0.71'
189
+ version: '1.57'
177
190
  - !ruby/object:Gem::Dependency
178
191
  name: rubocop-jekyll
179
192
  requirement: !ruby/object:Gem::Requirement
180
193
  requirements:
181
194
  - - "~>"
182
195
  - !ruby/object:Gem::Version
183
- version: '0.10'
196
+ version: '0.14'
184
197
  type: :development
185
198
  prerelease: false
186
199
  version_requirements: !ruby/object:Gem::Requirement
187
200
  requirements:
188
201
  - - "~>"
189
202
  - !ruby/object:Gem::Version
190
- version: '0.10'
203
+ version: '0.14'
204
+ - !ruby/object:Gem::Dependency
205
+ name: base64
206
+ requirement: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ type: :development
212
+ prerelease: false
213
+ version_requirements: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ - !ruby/object:Gem::Dependency
219
+ name: benchmark
220
+ requirement: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ type: :development
226
+ prerelease: false
227
+ version_requirements: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ version: '0'
232
+ - !ruby/object:Gem::Dependency
233
+ name: ostruct
234
+ requirement: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - ">="
237
+ - !ruby/object:Gem::Version
238
+ version: '0'
239
+ type: :development
240
+ prerelease: false
241
+ version_requirements: !ruby/object:Gem::Requirement
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ - !ruby/object:Gem::Dependency
247
+ name: tsort
248
+ requirement: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ type: :development
254
+ prerelease: false
255
+ version_requirements: !ruby/object:Gem::Requirement
256
+ requirements:
257
+ - - ">="
258
+ - !ruby/object:Gem::Version
259
+ version: '0'
191
260
  - !ruby/object:Gem::Dependency
192
261
  name: webmock
193
262
  requirement: !ruby/object:Gem::Requirement
@@ -202,7 +271,6 @@ dependencies:
202
271
  - - "~>"
203
272
  - !ruby/object:Gem::Version
204
273
  version: '3.0'
205
- description:
206
274
  email:
207
275
  - ben.balter@github.com
208
276
  executables: []
@@ -219,7 +287,6 @@ homepage: https://github.com/benbalter/jekyll-remote-theme
219
287
  licenses:
220
288
  - MIT
221
289
  metadata: {}
222
- post_install_message:
223
290
  rdoc_options: []
224
291
  require_paths:
225
292
  - lib
@@ -227,15 +294,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
227
294
  requirements:
228
295
  - - ">="
229
296
  - !ruby/object:Gem::Version
230
- version: 2.3.0
297
+ version: 2.7.0
231
298
  required_rubygems_version: !ruby/object:Gem::Requirement
232
299
  requirements:
233
300
  - - ">="
234
301
  - !ruby/object:Gem::Version
235
302
  version: '0'
236
303
  requirements: []
237
- rubygems_version: 3.2.14
238
- signing_key:
304
+ rubygems_version: 4.0.10
239
305
  specification_version: 4
240
306
  summary: Jekyll plugin for building Jekyll sites with any GitHub-hosted theme
241
307
  test_files: []